﻿
CREATE OR REPLACE FUNCTION planillas.usp_getnextidpersona(persona integer)
  RETURNS character AS
$BODY$
	declare id_registro character(5);
	idtemp character (12);
	newid character (12);
begin
	id_registro:=(SELECT tb_tipo_persona.cod_persona 
			FROM planillas.tb_tipo_persona
			WHERE tb_tipo_persona.id_tipopersona =persona);

	if( id_registro is null) then
		id_registro :='';
	end if;

	if(id_registro<>'') then
		idtemp:=(	SELECT  CAST(substring(a.id_persona,length(id_registro)+1,12-length(id_registro))as integer)+1 as lastid
				FROM   planillas.tb_persona a
				WHERE substring(a.tipo_per_sistema,persona,1)='1'
				ORDER BY CAST(substring(a.id_persona,length(id_registro)+1,12-length(id_registro))as integer) desc
				limit 1
			);

		if(idtemp is null) then
			newid:= id_registro || '1' ;
			
		ELSE
		--raise  'notice % :',idtemp;
			newid:= id_registro || cast(idtemp  as character) ;
		end if ;

	--raise  'notice % :',id_registro; 

		if(	newid is null) then
			newid :=id_registro||'1';
		end if ;	

	--raise  'notice % :',newid; 

	end if;	

	RETURN newid;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;

create or replace function planillas.usp_mantenimiento_direccion(
  _idir_personal integer ,
  _dir_direccionpersona character varying(200),
  _tel_direccionpersona character varying(20),
  _ubigeo character varying(10) ,
  _id_persona character varying(12) ,
  _con_direccionpersona character varying(200),
  _mov_direccionpersona character varying(20),
  _nex_direccionpersona character varying(20),
  _rpm_direccionpersona character varying(20),
  _ref_direccionpersona character varying(200),
  _email_direccionpersona character varying(200),
  _id_estado integer,
  _is_principal integer,
  _op integer
  )
 RETURNS integer AS
$BODY$
declare id_registro integer;
begin
if(_op=1) then
		id_registro:= (select coalesce(max(idir_personal),0)+1 from planillas.tb_direccionpersona where id_persona=_id_persona);

		if(id_registro is null) then
			id_registro=1;
		end if;
			
		INSERT INTO planillas.tb_direccionpersona(
				idir_personal, dir_direccionpersona, tel_direccionpersona, ubigeo, id_persona, con_direccionpersona, mov_direccionpersona, nex_direccionpersona, 
				rpm_direccionpersona, ref_direccionpersona, email_direccionpersona, id_estado, is_principal)
		VALUES (id_registro, _dir_direccionpersona, _tel_direccionpersona, _ubigeo, _id_persona, _con_direccionpersona, _mov_direccionpersona, _nex_direccionpersona, 
				_rpm_direccionpersona, _ref_direccionpersona, _email_direccionpersona, 1,  _is_principal);
else
	UPDATE planillas.tb_direccionpersona
	   SET  dir_direccionpersona=_dir_direccionpersona, tel_direccionpersona=_tel_direccionpersona, 
	       ubigeo=_ubigeo,  con_direccionpersona=_con_direccionpersona, mov_direccionpersona=_mov_direccionpersona, 
	       nex_direccionpersona=_nex_direccionpersona, rpm_direccionpersona=_rpm_direccionpersona, ref_direccionpersona=_ref_direccionpersona, 
	       email_direccionpersona=email_direccionpersona, id_estado=id_estado, is_principal=_is_principal
	 WHERE idir_personal=_idir_personal and id_persona=_id_persona;
	 id_registro:=_idir_personal;
end if;
RETURN id_registro;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;



create or replace  function planillas.usp_mantenimientopersona
(
_id_persona character varying(12)  ,
 _doc_persona VARCHAR(20),
  _nom_persona VARCHAR(50),
  _ape_persona VARCHAR(20),
  _fullname_persona VARCHAR(200),
  _obs_presona VARCHAR(500),
  _id_estado integer,
  _rs_persona VARCHAR(200),
  _nom_com_persona VARCHAR(200),
  _est_civ_persona INTEGER,
  _fecnac_persona date,
  _sex_persona INTEGER,
  _tipo_per_sistema VARCHAR(20),
  _id_documento INTEGER  ,
  _id_area INTEGER,
  _id_cargo INTEGER,
  _id_profesion INTEGER,
  _id_gradoinstruccion INTEGER,
  _lug_naci_persona VARCHAR(100),
  _id_tipo_proveedor INTEGER,
  _id_tipo_cliente INTEGER,
  _deuda_confidencial INTEGER,
  _noaptocredito INTEGER,
  _op INTEGER,
  _persona integer
)
RETURNS character varying as
$BODY$
	declare id_registro character(5);

	begin
	id_registro:='';
		if(_op=1) then
		
        	if( not exists(select 1 from planillas.tb_persona a
            				where a.id_documento=_id_documento and a.doc_persona= _doc_persona)) then

		id_registro:=planillas.usp_getnextidpersona(_persona);

			if(id_registro<>'') then
				INSERT INTO planillas.tb_persona(
							id_persona,doc_persona,nom_persona,ape_persona,fullname_persona,
							obs_presona,id_estado,rs_persona,nom_com_persona,est_civ_persona,
							fecnac_persona,sex_persona,tipo_per_sistema,id_documento,id_area,
							id_cargo,id_profesion,id_gradoinstruccion,lug_naci_persona,id_tipo_proveedor,
							id_tipo_cliente,deuda_confidencial,noaptocredito)
				VALUES (id_registro,_doc_persona,_nom_persona,_ape_persona,_fullname_persona,_obs_presona,
					_id_estado,_rs_persona,_nom_com_persona,_est_civ_persona,_fecnac_persona,_sex_persona,
					_tipo_per_sistema,_id_documento,_id_area,_id_cargo,_id_profesion,_id_gradoinstruccion,
					_lug_naci_persona,_id_tipo_proveedor,_id_tipo_cliente,_deuda_confidencial,_noaptocredito);
			end if;
        	end if;
        else
        	UPDATE planillas.tb_persona
            	SET doc_persona = _doc_persona,  nom_persona = _nom_persona,  ape_persona = _ape_persona,
                	fullname_persona = _fullname_persona,  obs_presona = _obs_presona,  id_estado = _id_estado,
                    rs_persona = _rs_persona,  nom_com_persona = _nom_com_persona,  est_civ_persona = _est_civ_persona,
					fecnac_persona = _fecnac_persona,  sex_persona = _sex_persona,  tipo_per_sistema = _tipo_per_sistema,
					id_documento = _id_documento,  id_area = _id_area,  id_cargo = _id_cargo,  id_profesion = _id_profesion,
					id_gradoinstruccion = _id_gradoinstruccion,  lug_naci_persona = _lug_naci_persona,
                    id_tipo_proveedor = _id_tipo_proveedor,  id_tipo_cliente = _id_tipo_cliente,  deuda_confidencial = _deuda_confidencial,
					noaptocredito = _noaptocredito
            WHERE id_persona = _id_persona ;
            id_registro:= _id_persona;
        end if;
        RETURN id_registro;
	end

$BODY$
LANGUAGE 'plpgsql'
VOLATILE;
CREATE OR REPLACE FUNCTION common.usp_mantenimiento_documentos (
  _id_documento integer,
  _des_documento varchar,
  _abre_documento varchar,
  _doc_sunat varchar,
  _ingr_sali_documento integer,
  _num_lin_documento integer,
  _afecto_igv integer,
  _id_estado integer,
  _val_documento integer,
  _tipodoc_sistema varchar,
  _sig_docummento integer,
  _op integer
)
RETURNS integer AS
$body$
  declare id_doc integer;
  begin
	if(_op=1) then
		/*si no existe el documento creamos uno nuevo*/
		if (not exists (select 1 from common.tb_documento where des_documento=_des_documento)) then
			id_doc:=(select coalesce(max(id_documento),0)+1 from common.tb_documento);

			if(id_doc is null) then
				id_doc:=1;
			end if;

			INSERT INTO common.tb_documento(id_documento, des_documento, abre_documento, doc_sunat,
				ingr_sali_documento, num_lin_documento, afecto_igv, id_estado, val_documento,
				tipodoc_sistema, sig_docummento)
			VALUES (id_doc, _des_documento, _abre_documento, _doc_sunat, _ingr_sali_documento,
				_num_lin_documento, _afecto_igv, _id_estado, _val_documento, _tipodoc_sistema, _sig_docummento);
		else
		/*si existe devolvemos 1*/
			id_doc:=-1;
		end if;
	else
		update common.tb_documento
			SET des_documento=_des_documento, abre_documento=_abre_documento, doc_sunat=_doc_sunat,
				ingr_sali_documento=_ingr_sali_documento, num_lin_documento=_num_lin_documento,
				afecto_igv=_afecto_igv, id_estado=_id_estado,val_documento=_val_documento,
				tipodoc_sistema=_tipodoc_sistema, sig_docummento=_sig_docummento
		where id_documento=_id_documento;
		id_doc:=_id_documento;
	end if;
	return id_doc;
  end;
$body$
LANGUAGE 'plpgsql'
VOLATILE
CALLED ON NULL INPUT
SECURITY INVOKER
COST 100;


create or replace function planillas.usp_mantenimientocuentas(
_num_pos integer ,  
_id_banco integer,
_id_moneda integer,
_id_estado integer,
_num_cuenta character varying,
_cci_cta character varying,
_id_persona character varying,
_id_tipoctacte integer ,
_op int)
RETURNS  integer AS
$BODY$
declare id_registro integer;
begin
	if( _op=1) then 
		id_registro := (select coalesce(max(num_pos),0)
			from planillas.tb_ctasctes
			where id_persona=_id_persona
			);
		if( id_registro is null) then
			id_registro :=0;
		end if;
			id_registro:=id_registro+1;
		
		INSERT INTO planillas.tb_ctasctes(num_pos, id_banco, id_moneda, id_estado, num_cuenta, cci_cta, id_persona, id_tipoctacte)
		VALUES (id_registro, _id_banco, _id_moneda, _id_estado, _num_cuenta, _cci_cta, _id_persona, _id_tipoctacte);
	else 
		UPDATE planillas.tb_ctasctes
			SET id_banco=_id_banco, id_moneda=_id_moneda, id_estado=_id_estado, num_cuenta=_num_cuenta, 
			cci_cta=_cci_cta, id_tipoctacte=_id_tipoctacte
		WHERE id_persona=_id_persona and num_pos=_num_pos;
	id_registro:=	_num_pos;
	end if;
RETURN id_registro;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;


create or replace function planillas.usp_mantenimientoplanilla
(
  _id_planilla integer ,
  _cuspp_planilla character varying,
  _essalud_planilla character varying,
  _fecins_planilla date,
  _suel_planilla integer,
  _fecces_planilla date,
  _id_persona character varying,
  _numhijos_planilla integer,
  _id_afp integer,
  _enplanilla integer,
  _fec_ing_planilla date
  )
  RETURNS integer AS
$BODY$
	declare id_registro integer;
begin
	
id_registro:=(select id_planilla from planillas.tb_planilla where id_persona=_id_persona);

if( id_registro is null) then
	id_registro:=(select coalesce(max(id_planilla),0)+1 from planillas.tb_planilla );	
	if( id_registro is null) then
		id_registro:=1;
	end if;
	INSERT INTO planillas.tb_planilla(id_planilla, cuspp_planilla, essalud_planilla, fecins_planilla, 
					suel_planilla, fecces_planilla, id_persona, numhijos_planilla, 
					 id_afp, enplanilla, fec_ing_planilla)
	VALUES (id_registro, _cuspp_planilla, _essalud_planilla, _fecins_planilla, 
					_suel_planilla, _fecces_planilla, _id_persona, _numhijos_planilla, 
					_id_afp, _enplanilla, _fec_ing_planilla);
else
	UPDATE planillas.tb_planilla
		SET cuspp_planilla=_cuspp_planilla, essalud_planilla=_essalud_planilla, fecins_planilla=_fecins_planilla, 
			suel_planilla=_suel_planilla, fecces_planilla=_fecces_planilla, numhijos_planilla=_numhijos_planilla, 
			id_afp=_id_afp, enplanilla=_enplanilla, fec_ing_planilla=_fec_ing_planilla
	WHERE id_planilla=id_registro and id_persona=_id_persona;
end if;
RETURN id_registro;
end;
$BODY$
 LANGUAGE plpgsql VOLATILE;

 CREATE OR REPLACE FUNCTION planillas.usp_mantenimiento_contactos
(
  _id_contacto integer,
  _nom_contacto character varying,
  _tel_contacto character varying,
  _mov_contacto character varying,
  _nex_contacto character varying,
  _rpm_contacto character varying,
  _ref_contacto character varying,
  _id_estado integer,
  _email_contacto character varying,
  _web_contacto character varying,
  _id_documento integer,
  _doc_contacto character varying,
  _sex_contacto integer,
  _dir_contacto character varying,
  _ubigeo character varying,
  _centrab_contacto character varying,
  _ubi_contacto character varying,
  _ingrmes_contacto double precision,
  _ocu_contacto character varying,
  _trabactu_contacto character varying,
  _op integer
)
returns integer as
$BODY$
declare id_registro integer;
begin
	if(_op=1) then
		id_registro:=(select coalesce(max(id_contacto),0) from planillas.tb_contactos);
		if(id_registro is null) then
			id_registro :=1;
		else
		id_registro:=id_registro +1;
		end if;
		INSERT INTO planillas.tb_contactos(id_contacto, nom_contacto, tel_contacto, mov_contacto, nex_contacto, 
						rpm_contacto, ref_contacto, id_estado, email_contacto, web_contacto, 
						id_documento, doc_contacto, sex_contacto, dir_contacto, ubigeo, 
						centrab_contacto, ubi_contacto, ingrmes_contacto, ocu_contacto, trabactu_contacto)
		VALUES (id_registro, _nom_contacto, _tel_contacto, _mov_contacto, _nex_contacto, 
				_rpm_contacto, _ref_contacto, _id_estado, _email_contacto, _web_contacto, 
				_id_documento, _doc_contacto, _sex_contacto, _dir_contacto, _ubigeo, 
				_centrab_contacto, _ubi_contacto, _ingrmes_contacto, _ocu_contacto, _trabactu_contacto);
	else
		UPDATE planillas.tb_contactos
		   SET nom_contacto=_nom_contacto, tel_contacto=_tel_contacto, mov_contacto=_mov_contacto, 
		       nex_contacto=_nex_contacto, rpm_contacto=_rpm_contacto, ref_contacto=_ref_contacto, id_estado=_id_estado, 
		       email_contacto=_email_contacto, web_contacto=_web_contacto, id_documento=_id_documento, doc_contacto=_doc_contacto, 
		       sex_contacto=_sex_contacto, dir_contacto=_dir_contacto, ubigeo=_ubigeo, centrab_contacto=_centrab_contacto, 
		       ubi_contacto=_ubi_contacto, ingrmes_contacto=_ingrmes_contacto, ocu_contacto=_ocu_contacto, trabactu_contacto=_trabactu_contacto
		 WHERE id_contacto=_id_contacto;
 
		id_registro:=_id_contacto;
	end if;
return id_registro;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE

create or replace function planillas.usp_mantenimiento_persona_contacto(
  _id_contacto integer ,
  _id_persona character varying,
  _id_estado integer,
  _tipo_contacto integer ,
  _id_registro integer ,
  _op integer)
  returns integer
  as
  $body$
  declare id_generado integer;
  begin
	if(_op=1) then   
		if( not (exists(select 1 from planillas.tb_persona_contacto where _id_persona=id_persona and 
				id_contacto=_id_contacto and tipo_contacto =_tipo_contacto))) then 
			id_generado:=(select coalesce(max(id_registro),0)+1 from planillas.tb_persona_contacto);

			if(id_generado=0) then
				id_generado:=1;
			end if;

			
			INSERT INTO planillas.tb_persona_contacto(id_contacto, id_persona, id_estado, tipo_contacto, id_registro)
			VALUES (_id_contacto, _id_persona, _id_estado, _tipo_contacto, id_generado);
		else
		id_generado:=-1;
		end if;
	else
		UPDATE planillas.tb_persona_contacto
			SET id_contacto=_id_contacto, id_persona=_id_persona, id_estado=_id_estado, 
			tipo_contacto=_tipo_contacto
		WHERE id_registro=_id_registro;
		id_generado:=_id_registro;
	end if;
return id_generado;
  end;
  $body$  
  LANGUAGE plpgsql VOLATILE;


CREATE OR REPLACE FUNCTION compras.usp_inserta_detallecompra(_id_precios integer, _item integer, _precio numeric, _cantidad numeric, _incluido numeric, _val_venta numeric, _dstco numeric, _val_igv numeric, _costo_final numeric, _flete numeric, _porcent_igv numeric, _porcent1 numeric, _fec_registro timestamp without time zone, _peso numeric, _id_almacen integer, _id_unidad integer, _id_producto character varying, _id_lista integer, _id_lote character varying, _id_sucursal integer, _nro_doc_compra character, _id_dir_proveedor integer, _id_proveedor character varying, _fec_documento date)
  RETURNS integer AS
$BODY$
	declare id_registro integer;
begin

id_registro:=(select coalesce(max(id_planilla),0)+1 from planillas.tb_planilla );

if( id_registro is null) then
		id_registro:=1;
	end if;

INSERT INTO compras.tb_det_compra(
            id_precios, item, precio, cantidad, incluido, val_venta, dstco, 
            val_igv, costo_final, flete, porcent_igv, porcent1, fec_registro, 
            peso, id_almacen, id_unidad, id_producto, id_lista, id_lote, 
            id_sucursal, nro_doc_compra, id_dir_proveedor, id_proveedor, 
            fec_documento)
    VALUES (_id_precios, id_registro, _precio, _cantidad, _incluido, _val_venta, _dstco, 
            _val_igv, _costo_final, _flete, _porcent_igv, _porcent1, _fec_registro, 
            _peso, _id_almacen, _id_unidad, _id_producto, _id_lista, _id_lote, 
            _id_sucursal, _nro_doc_compra, _id_dir_proveedor, _id_proveedor, 
            _fec_documento);

return id_registro;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;

CREATE OR REPLACE FUNCTION compras.usp_inserta_compra(_anio character, _idcompra character varying, _idmes character, _id_documento integer, _nro_doc_compra character, _id_dir_proveedor integer, _fec_ing_sistema timestamp without time zone, _fec_documento date, _imp_venta numeric, _imp_igv numeric, _igv_total numeric, _imp_dctso numeric, _porcent_dscto numeric, _id_sucursal integer, _val_reintegro numeric, _persepcion numeric, _id_moneda integer, _idusuario_r character, _id_formapago integer, _id_proveedor character varying, _id_operacion character)
  RETURNS integer AS
$BODY$
	declare id_registro integer;
begin
	id_registro:=0;
	INSERT INTO compras.tb_compra(
            anio, idcompra, idmes, id_documento, nro_doc_compra, id_dir_proveedor, 
             fec_ing_sistema, fec_documento, imp_venta, imp_igv, 
            igv_total, imp_dctso, porcent_dscto, id_sucursal, val_reintegro, 
            persepcion, id_moneda,  idusuario_r,  id_formapago, 
            id_proveedor, id_operacion)
    VALUES (_anio, _idcompra, _idmes, _id_documento, _nro_doc_compra, _id_dir_proveedor, 
            _fec_ing_sistema, _fec_documento, _imp_venta, _imp_igv, 
            _igv_total, _imp_dctso, _porcent_dscto, _id_sucursal, _val_reintegro, 
            _persepcion, _id_moneda,  _idusuario_r,  _id_formapago, 
            _id_proveedor, _id_operacion);

            id_registro:=1;
	return id_registro;
end;
$BODY$
  LANGUAGE plpgsql VOLATILE;